"""
    手雷炸了，可能伤害敌人、玩家生命。
        还可能伤害未知事物（鸭子。房子。。）
    要求：增加了新事物，不影响手雷
    体会：   继承的作用
            多态的体现
            设计原则
                开闭原则
                单一职责
                依赖倒置
"""


class Person:
    """
        父类
    """

    def __init__(self, name, blood):
        self.name = name
        self.blood = blood

    # 继承，隔离子类的变化
    def injured(self, akt):
        # 报错提示，没有实现的错误。 如果子类方法没有重写，会找父类则提示错误
        # 子类实现了父类中相同的方法（方法名， 参数）， 在调用该方法的时候，实际上调用的是子类，否则调用父类（例如不同名）
        raise NotADirectoryError


class Enemy(Person):
    """
        子类
    """

    def injured(self, atk):
        print(f"敌人{self.name}受到了{atk}点伤害！")
        hp = self.blood - atk
        print(f"血量还有{hp}点血。")


class Player(Person):
    """
        子类
    """

    def injured(self, atk):
        print(f"玩家{self.name}受到了{atk}点伤害！")
        hp = self.blood - atk
        print(f"血量还有{hp}点血。")


class Antitank:
    def __init__(self, atk):
        self.atk = atk

    def explode(self, atks):
        if isinstance(atks, Person):  # 判断传过来的类型是不是Person父类，是则执行下面语句
            print("手雷爆炸了对：", end='')

            # 只调用类，让父类查找要被爆炸的人
            atks.injured(self.atk)
        else:
            print('必须指定Person的子类才行！')


zs = Player('张三', 101)
dr = Enemy('李四', 101)
sl = Antitank(10)
sl.explode(zs)
sl.explode(dr)
